﻿/***
  \brief  Главный класс ядра 
*/


#pragma once


#include "core_api.h"
#include "common_types.h"
#include "user.h"

#include <dlguif/loader.h>

#include "dict.h"
#include "Config.h"
#include "WordsWeight.h"
#include "Category.h"

//-------------------------------------------------------------------------


#define CORE_VERSION_MAJOR  0 
#define CORE_VERSION_MINOR  0
#define CORE_VERSION_BUILDNUMBER 32
 


//-------------------------------------------------------------------------

//! \brief    основной главный  класс 
class  CORE_API   Core {
private:
   bool             m_isrun;
   PtrAuto<UserInfoList>    m_userInfoList;
   int  m_currentUserIndex;
   PtrAuto<dlguif::Loader> m_dlguifLoader;

   PtrAuto<Dictionary>     m_Dictionary;
   PtrAuto<Config>         m_config;
   PtrAuto<WordsWeight>    m_WordsWeight;
   PtrAuto<CategoryList>   m_CategoryList;

   


public:
	//! \brief получить папку с   приложением
	static std::wstring GetExeDirectory();

	Core()  throw (Error);

	~Core();

	//! \brief  Стартовая инициализация
	int Initialize(PCoreInitData pcid, PGuiCallbackData pccd );

 
	//! \brief    Завершение работы
	void Finalize();

	//! \brief   Получить директорию со пользователями
	std::wstring GetUsersDirectory() const;
	//! \brief   Получить директорию со словарём
	std::wstring GetDictDirectory() const;
	//! \brief    Получить директорию со звуками (голосом озвучки)
	std::wstring GetSoundDirectory() const;
	//! \brief ПОлучить пусть к файлу веса слов
	std::wstring GetWordWeightPath() const;
	//! \brief Получить папку расположения категорий слов.
	std::wstring GetCategoryDirectory() const;

	//! \brief   Выбран ли хоть один пользователь
	bool IsUserSelected() const 
	{
		return m_currentUserIndex != -1;
	}

	//!  \brief  Получить текущего пользователя. Если пользователь не выбран то вернёт NULL
	UserInfo* GetCurrentUser() throw(Error);
	//! \brief  выбрать пользователя
	void SelectUser(const std::string& user_name) throw(Error);

	UserInfoList* GetUserInfoList()
	{
		assert(m_userInfoList);
		return m_userInfoList;
	}

	//!   \brief   Получить словарь
	Dictionary* GetDictionary() ;
	//!  \brief   получить конфиг
	Config* GetGonfig();
	//! \brief  получить вес слов
	WordsWeight* GetWordsWeight();
	//! \brief получить список категорий
	CategoryList* GetCategoryList();

 


};

//=========================================================================

//! Создать !
 CORE_API void DoCreateCore()   throw (Error);
//!  получить указатель на глобальный объект core
 CORE_API Core* GetGore();

